/*
 * @Description:
 * @Version: 1.0
 * @Author: wen shukai
 * @Date: 2022-06-23 13:25:58
 * @LastEditTime: 2022-06-24 15:35:58
 * @LastEditors: wen shukai
 * @FilePath: \self-taught-js\js数组常用方法.js
*/
//js 数组常用方法
//join 数组转换成字符串 规定连接符 默认是逗号
// var arr = [1,2,3]
// console.log(arr.join())
// console.log(arr.join('-'))
// console.log(arr)

//数组 常用方法前曾后曾 push   移除pop
// var arr = ['lily','lucy','tom'];
// var count = arr.push('jack','sean')
// console.log(count)
// console.log(arr);
// var item = arr.pop()
// console.log(item)
// console.log(arr)

/*
 *  shift()删除原来的数组第一项返回删除的值
    unshift()将参数添加到原数组开头，并且返回数组的长度
 *
 */
// var arr = ['1','2','3']
// var count = arr.unshift('4','5','6')
// // console.log(count)
// // console.log(arr)
// var item = arr.shift(2)
// console.log(item)
// console.log(arr)

/*******
 * @description:
 * sort() 将数组里的项从小到大排序
 * sort() 方法比较的是字符串 没有按照数值的大小对数字进行排序
 */
// var arr = ['3','2','1','4']
// console.log(arr)
// //console.log(arr.sort())
// function a(a,b){
//   return b - a
// }
// console.log(arr.sort(a))
/*******
 * @description: reverse() 反转数组项的顺序
 *  会改变原来的数组
 */
// var arr = [13,24,'51','3']
// console.log(arr.reverse())
// console.log(arr)
/*******
 * @description:
 * concat() 将参数加到原数组中    不会改变原来的数组
 */
// var arr = [1,3,5,7]
// var arrCopy = arr.concat(9,10,11)
// console.log(arrCopy)
// console.log(arr)

// let arr = [1, 2, 3, 4, 5]
// let arr1 = [6, 7, 8, 9]
// let arr2 = arr.concat(arr1)
// console.log(arr2)

/*******
 * @description:
 * slice() 返回  第一个参数 从几开始  第二个参数截取几位  不会改变原来的数组
 */
// var arr = [1, 2, 3, 4, 5, 6]
// var arrCopy = arr.slice(0, 3)
// console.log(arrCopy)
// console.log(arr)

/*******
 * @description:
 * splice 删除 插入替换
 * 删除 第一个参数 从哪位开始  第二个参数 删除几位 会操作原来的数组
 * 插入：可以向指定位置插入任意数量的项，只需提供 3 个参数：起始位置、 0（要删除的项数）和要插入的项。书写格式：arr.splice( 2,0,4,6 )
 */
// var arr = [1, 2, 3, 4, 5, 6, 7]
// // var arrRemoved = arr.splice(0, 2)
// var arrRemoved = arr.splice(2, 0, 8, 9)
// console.log(arr)
// console.log(arrRemoved)
/*******
 * @description:
 * filter() 过滤
 */
// var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// var arr2 = arr.filter(function (x, index) {
//   return x >= 8
// })
// console.log(arr)
// console.log(arr2)
/*******
 * @description:
 * find() 在数组中查找   只找到第一个满足条件的 找到之后就终止了
 */
// var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// var arr2 = arr.find(item => item > 5)
// console.log(arr2)
/*******
 * @description:
 * findIndex() 在数组中查找
 */
// var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
// var arr1 = arr.findIndex(item => {
//   return item > 6
// })
// var arr1 = arr.findIndex(function (item) {
//   return item > 6
// })
// console.log(arr)
// console.log(arr1)

/*******
 * @description:
 * reduce() 方法使用
 */
// 求数组的和
// const sum = [1, 2, 3].reduce((arr, item, index) => {
//   console.log(arr, '4', item, '5', index, '6')
//   return arr + item
// })
// console.log(sum)

//累加对象数组里边的值
// const arr = [{ score: 9 }, { score: 10 }, { score: 11 }]
// const sum = arr.reduce((arr, item) => {
//   return arr + item.score
// }, 0)
// console.log(sum)

//二维数组转一维  注意这里肯定得给累加器初始值一个空数组 让后结合扩展运算符
// const arr = [[1, 2], [3, 4], [5, 6]]
// const mergeArr = arr.reduce((arr, item) => {
//   return [...arr, ...item]
// }, [])
// console.log(mergeArr)

//计算数组中每个元素出现的次数  等待研究https://blog.csdn.net/qq_42356513/article/details/122796386
// const arr = [1, 2, 3, 1, 31, 3, 1, 45, 5, 6, 1]
// //看累加器有这一项没 悠久吧这一项的value + 1 没有就把 value 赋值1
// const obj = arr.reduce((arr, item) => {
//   console.log(arr, '11')
//   console.log(item, '22')
//   if (item in arr) {
//     arr[item]++
//   } else {
//     arr[item] = 1
//   }
//   return arr
// }, {})
// console.log(obj)

// const arr = [{ value: '1' },
// { value: '3' }, { value: '' },
// { value: '' }, { value: '' }, { value: '' }, { value: '' }]
// const arr2 = arr.filter(item => {
//   return item.value
// })
// const res = arr.map(item => {
//   let aa = []
//   if (item.value === '') {
//     delete (item.value)
//   } else {
//     return aa
//   }
// })
// console.log(arr)
// var arr2 = arr.filter((item, index) => {
//   //console.log(item);
//   return item.value !== ''

// })
// console.log(arr2)
// const arr = [
//   {
//     name: '小明',
//     sex: '男',
//     id: '1'
//   },
//   {
//     name: '小红',
//     sex: '女',
//     id: '2'
//   },
//   {
//     name: '小花',
//     sex: '男',
//     id: '3'
//   }
// ]
// const res = arr.reduce((item, index) => {
//   //如果男或女在对象里面找不到,那么久新增一个键名
//   console.log(item, '11')
//   console.log(index, '22')
//   // if (!(val.sex in acc)) {
//   //   acc[val.sex] = []
//   // }
//   // acc[val.sex].push(val)
//   // return acc
// }, {})
// console.log(res)
/*******
 * @description: 把对象数组中的数组合并起来
 * reduce
 */
// const arr = [
//   {
//     name: '小红',
//     books: ['java', 'js']
//   }, {
//     name: '小明',
//     books: ['c++']
//   },
//   {
//     name: '小华',
//     books: ['python']
//   }
// ]
// const res = arr.reduce((acc, val) => [...acc, ...val.books], [])
// console.log(res)
/******* 
 * @description: 
 * 数组去重
 */
// const arr = [1, 2, 1, 2, 3, 1, 1, 3, 2, 3, 2, 32, 3]
// const res = arr.reduce((acc, val) => {
//   if (acc.indexOf(val) === -1) {
//     acc.push(val)
//   }
//   return acc
// }, [])
// const res = [...new Set(arr)]
// console.log(res)
// var arr = [1,2,3,4,5,6,7]
// const arr1 = arr.slice(2,4)
// console.log(arr,arr1)
// arr.splice(1,2,8,9)
// console.log(arr.indexOf(1))


// 元素计数
// var arr = [1,1,1,2,2,3,3,4,5,3,2,3,4]
// var obj = {}
// for(var i =0;i<arr.length;i++){
//    if(!(i in arr)) continue
//    if(!obj[arr[i]])obj[arr[i]]=0
//    obj[arr[i]]++
// }
// console.log(obj)
// var arr = [1,2,3,4,5,6]
// const a = arr.filter((item)=>{
//    return item > 3
// })
// console.log(a)
// var a = [{data: {value: 1111}},
//          {data: {value: 1111}}
//             ];
// a[0].data.value=222
// a.map((item)=>{
//    return{
//       data: item.value=222
//    }
// })
// a.forEach(item=>{
//    item.data.value =222
// })
// console.log(a)